package com.dingding.nettyserver.core.scanner;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.dingding.nettyserver.common.annotion.RequestCommand;

/**
 * <p>命令执行器
 * 
 * <p>把handler中的所有带注解 {@link RequestCommand} 的方法封装为一个命令执行器
 * 
 * @author fengshuonan
 * @date 2016年11月18日 下午8:20:10
 */
public class Invoker {
	
	/**
	 * 方法
	 */
	private Method method;
	
	/**
	 * 目标对象
	 */
	private Object target;
	
	/**
	 * 本方法是否需要登录
	 */
	private boolean requiredLogin;
	
	public static Invoker valueOf(Method method, Object target,boolean required){
		Invoker invoker = new Invoker();
		invoker.setMethod(method);
		invoker.setTarget(target);
		invoker.setRequiredLogin(required);
		return invoker;
	}
	
	/**
	 * 执行
	 * @param paramValues
	 * @return
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 */
	public Object invoke(Object... paramValues){
		try {
			return method.invoke(target, paramValues);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}

	public Method getMethod() {
		return method;
	}

	public void setMethod(Method method) {
		this.method = method;
	}

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public boolean isRequiredLogin() {
		return requiredLogin;
	}

	public void setRequiredLogin(boolean requiredLogin) {
		this.requiredLogin = requiredLogin;
	}
	
}
